package ar.edu.utn.frba.disenio.aterrizar.fechas;

public class Fecha {
	
	int anio;
	int mes;
	int dia;
	
	////////////// GETTER AND SETTER /////////////////
	
	public int getAnio() {
		return anio;
	}
	public void setAnio(int anio) {
		this.anio = anio;
	}
	public int getMes() {
		return mes;
	}
	public void setMes(int mes) {
		this.mes = mes;
	}
	public int getDia() {
		return dia;
	}
	public void setDia(int dia) {
		this.dia = dia;
	}
	
	////////////////////////////////////////////////
	
	public void setearFecha(int dia, int mes, int anio){
		
		if(this.sosFechaValida(dia, mes, anio)){
			this.setDia(dia);
			this.setMes(mes);
			this.setAnio(anio);
		}else{
			throw new FechaInvalidaException();
		}
	}

	public boolean sosFechaValida(int dia,int mes,int anio){
		
		if(this.sosAnioValido(anio) && this.sosMesValido(mes) && this.sosDiaValido(dia,mes,anio)){
			return true;
		}else{
			return false;
		}
	}
	
	private boolean sosAnioValido(int anio){
		if(anio>=2012){
			return true;
		}else{
			return false;
		}
	}
	
	private boolean sosMesValido(int mes){
		if(mes > 0 && mes < 13){
			return true;
		}else{
			return false;
		}
	}
		
	private boolean sosDiaValido(int dia, int mes, int anio){
			
		if(dia >0 && dia <= this.cuantosDiasTiene(mes, anio)){
			return true;
		}else{
			return false;
		}
	}

	private int cuantosDiasTiene(int mes, int anio){
		if(mes == 4 || mes == 6 || mes == 9 || mes == 11){
			return 30;
		}else if(mes == 2){
			if(this.esAnioBisiesto(anio)){
				return 29;	
			}else{
				return 28;	
			}		
		}else{
			return 31;
		}
	}
	
	
	public boolean sosFechaAnteriorA(Fecha unaFecha){
		
		int fecha_anterior = (this.getAnio() *10000+ this.getMes()*100 + this.getDia());
		int fecha_posterior = (unaFecha.getAnio() *10000+ unaFecha.getMes()*100 + unaFecha.getDia());
		
		if(fecha_anterior <= fecha_posterior){
			System.out.println("Soy una fecha anterior");
			return true;
		}else{
			System.out.println("No soy una fecha anterior");
			return false;
		}
	}

	
	public int diferenciaDeDias(Fecha fecha){
		
		if(this.sosFechaAnteriorA(fecha)){
			return this.calculoDeDiasDeDiferencia(fecha);
		}else{
			return fecha.calculoDeDiasDeDiferencia(this);
		}
	}
	
	
	private int calculoDeDiasDeDiferencia(Fecha fecha) {
		
		int[] vector = {0,31,59,90,120,151,181,212,243,273,304,334};
		int[] vector_inv = {334,306,275,245,214,184,153,122,92,61,31,0};        
        
		int contador = 0;
		
		if (fecha.getAnio()-this.getAnio() >=1)
	    {

	        contador+= this.cuantosDiasTiene(this.getMes(), this.getAnio()) - this.getDia() + vector_inv[this.getMes()-1];
	       
	        
	        if (this.esAnioBisiesto(this.getAnio()) && (this.getMes()== 1 || (this.getMes() == 2 && this.getDia()< 29) ) ){
	            contador++;
	        }
	        
	        for (int i= this.getAnio()+1; i<fecha.getAnio();i++)
	        {
	            if (this.esAnioBisiesto(i)){
	                contador+=366;
	            }else{
	                contador+=365;
	            }
	        }

	        contador+= vector[fecha.getMes()-1] + fecha.getDia();
	        	                                                                       
	         if (fecha.esAnioBisiesto(fecha.getAnio()) && (fecha.getMes() >=3 || (fecha.getMes()==2 && fecha.getDia() != 29))){
	            contador++;
	        }
	    }
		
	    if (fecha.getAnio()==this.getAnio()){
	    	
	    	contador+= this.getDia() + vector[this.getMes()-1];
	        
	    	contador = vector[fecha.getMes()-1] + fecha.getDia() - contador;
	        if (this.esAnioBisiesto(this.getAnio()) && ((this.getMes()== 1 || (this.getMes() == 2 && this.getDia()!= 29)) && fecha.getMes()>=3) ){
	            contador++;
	        }
	    }
	    
		return contador;
	}
	
	
	private boolean esAnioBisiesto(int anio){
		
		if ((anio% 4 == 0) && ((anio % 100 != 0) || (anio % 400 == 0)) ){  // Comprueba si el anio es bisiesto o no
			return true;
		}
		else{
			return false;
		}
	}
	
}